﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AcademiaEntidades;
using System.Data;
using System.Data.SqlClient;

namespace AcademiaDAO
{
    public class ProfesorDAO
    {
        public static List<Profesor> obtenerTodosProfesor(string orden, string nombre, int? legajo, string apellido)
        {
            List<Profesor> listaProfesor = new List<Profesor>();

            SqlConnection cn = null;
            try
            {
                cn = AccesoDato.dameConexion();
                cn.Open();
                SqlCommand cmd = new SqlCommand();
                string sql = @"select Top 1000 * from Profesor where 1 = 1 ";
                if (!string.IsNullOrEmpty(nombre))
                {
                    sql += " and nombre like @nombre";
                    cmd.Parameters.Add(new SqlParameter("@nombre", '%' + nombre + '%'));
                }
                if (!string.IsNullOrEmpty(apellido))
                {
                    sql += " and apellido like @apellido";
                    cmd.Parameters.Add(new SqlParameter("@apellido", '%' + apellido + '%'));
                }
                if (legajo.HasValue)
                {
                    sql += " and legajo = @legajo";
                    cmd.Parameters.Add(new SqlParameter("@legajo", legajo));
                }
                sql += " order by " + orden;
                cmd.CommandText = sql;
                cmd.Connection = cn;
                SqlDataReader dr = cmd.ExecuteReader();
                while(dr.Read())
                {
                    Profesor profe = new Profesor();
                    profe.IdProfesor = int.Parse(dr["IdProfesor"].ToString());
                    profe.Legajo = int.Parse(dr["Legajo"].ToString());
                    profe.Nombre = dr["Nombre"].ToString();
                    profe.Apellido = dr["Apellido"].ToString();
                    profe.idTipoDocumento = int.Parse(dr["IdTipoDocumento"].ToString());
                    profe.NumeroDocumento = dr["NumeroDocumento"].ToString();
                    if (dr["Telefono"] != DBNull.Value)
                        profe.Telefono = dr["Telefono"].ToString();
                    if(dr["Titulo"] != DBNull.Value)
                        profe.Titulo = dr["Titulo"].ToString();
                    listaProfesor.Add(profe);
                    profe = null;
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("No se pudieron obtener los datos de profesor");//El metodo que lo invoque debera tratar la exepcion
            }
            finally//Si la conexion se pudo abrir hay que cerrarla
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
            }
            return listaProfesor;
        }
        public static List<ProfesorConsulta> obtenerTodosProfesorFiltro(string orden, string nombre, int? legajo, string apellido)
        {
            List<ProfesorConsulta> listaProfesor = new List<ProfesorConsulta>();

            SqlConnection cn = null;
            try
            {
                cn = AccesoDato.dameConexion();
                cn.Open();
                SqlCommand cmd = new SqlCommand();
                string sql = @"select Top 1000 P.*, TD.Descripcion from Profesor P, TipoDocumento TD where P.IdTipoDocumento = TD.IdTipoDocumento ";
                if (!string.IsNullOrEmpty(nombre))
                {
                    sql += " and nombre like @nombre";
                    cmd.Parameters.Add(new SqlParameter("@nombre", '%' + nombre + '%'));
                }
                if (!string.IsNullOrEmpty(apellido))
                {
                    sql += " and apellido like @apellido";
                    cmd.Parameters.Add(new SqlParameter("@apellido", '%' + apellido + '%'));
                }
                if (legajo.HasValue)
                {
                    sql += " and legajo = @legajo";
                    cmd.Parameters.Add(new SqlParameter("@legajo", legajo));
                }
                sql += " order by " + orden;

                cmd.CommandText = sql;
                cmd.Connection = cn;
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    ProfesorConsulta profe = new ProfesorConsulta();
                    profe.IdProfesor = int.Parse(dr["IdProfesor"].ToString());
                    profe.Legajo = int.Parse(dr["Legajo"].ToString());
                    profe.Nombre = dr["Nombre"].ToString();
                    profe.Apellido = dr["Apellido"].ToString();
                    profe.idTipoDocumento = int.Parse(dr["IdTipoDocumento"].ToString());
                    profe.NumeroDocumento = dr["NumeroDocumento"].ToString();
                    if (dr["Telefono"] != DBNull.Value)
                        profe.Telefono = dr["Telefono"].ToString();
                    if (dr["Titulo"] != DBNull.Value)
                        profe.Titulo = dr["Titulo"].ToString();
                    profe.Descripcion = dr["Descripcion"].ToString();
                    listaProfesor.Add(profe);
                    profe = null;
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("No se pudieron obtener los datos de profesor");//El metodo que lo invoque debera tratar la exepcion
            }
            finally//Si la conexion se pudo abrir hay que cerrarla
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
            }
            return listaProfesor;
        }
        //Metodo para obtener un Profesor por id
        public static Profesor obtenerProfesorPorId(int idProfesor)
        {
            Profesor profe = new Profesor();
            SqlConnection cn = null;
            try
            {
                cn = AccesoDato.dameConexion();
                cn.Open();
                SqlCommand cmd = new SqlCommand();
                string sql = "select * from Profesor where IdProfesor = @idProfesor";
                cmd.Parameters.Add(new SqlParameter("@idProfesor", idProfesor));
                cmd.CommandText = sql;
                cmd.Connection = cn;
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    profe.IdProfesor = idProfesor;
                    profe.Legajo = int.Parse(dr["Legajo"].ToString());
                    profe.Nombre = dr["Nombre"].ToString();
                    profe.Apellido = dr["Apellido"].ToString();
                    profe.idTipoDocumento = int.Parse(dr["IdTipoDocumento"].ToString());
                    profe.NumeroDocumento = dr["NumeroDocumento"].ToString();
                    if (dr["Telefono"] != DBNull.Value)
                        profe.Telefono = dr["Telefono"].ToString();
                    if (dr["Titulo"] != DBNull.Value)
                        profe.Titulo = dr["Titulo"].ToString();
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("No se pudo obtener los datos del Profesor");//El metodo que lo invoque debera tratar la exepcion
            }
            finally//Si la conexion se pudo abrir hay que cerrarla
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
            }
            return profe;
        }
        //Metodo que se encarga de la alta y modificacion de un profesor
        public static void guardarProfesor(Profesor profe)
        {
            SqlConnection cn = null; 
            try
            {
                cn = AccesoDato.dameConexion();
                cn.Open();
                SqlCommand cmd = new SqlCommand();
                string sql = string.Empty;
                cmd.Parameters.Add(new SqlParameter("@Nombre", profe.Nombre));
                cmd.Parameters.AddWithValue("@Apellido", profe.Apellido);
                cmd.Parameters.Add(new SqlParameter("@IdTipoDocumento", profe.idTipoDocumento));
                cmd.Parameters.AddWithValue("@NumeroDocumento", profe.NumeroDocumento);
                if (!string.IsNullOrEmpty(profe.Telefono))
                    cmd.Parameters.Add(new SqlParameter("@Telefono", profe.Telefono));
                else
                    cmd.Parameters.Add(new SqlParameter("@Telefono", DBNull.Value));
                if (!string.IsNullOrEmpty(profe.Titulo))
                    cmd.Parameters.AddWithValue("@Titulo", profe.Titulo);
                else
                    cmd.Parameters.AddWithValue("@Titulo", DBNull.Value);


                if (profe.IdProfesor == 0)//Se trata de un alta
                {
                    // se obtiene el siguiente legajo de la tabla auxiliar
                    string sqlLegajo = "SELECT Legajo FROM ProfesorLegajoAux";
                    cmd.CommandText = sqlLegajo;
                    cmd.Connection = cn;
                    int legajo = int.Parse(cmd.ExecuteScalar().ToString());//El legajo se actualiza con un trigger en la base de dato
                    //La primera vez ocurre problema, hay que registrar un legajo por defecto o de inicio
                    //El trigger funciona

                    sql = @"Insert into Profesor(Legajo, Nombre, Apellido, IdTipoDocumento, NumeroDocumento, Telefono, Titulo) 
                            values(@Legajo, @Nombre, @Apellido, @IdTipoDocumento, @NumeroDocumento, @Telefono, @Titulo)";
                    cmd.Parameters.Add(new SqlParameter("@Legajo", legajo));//Al ser un alta le agrego el legajo obtenido de la tabla aux
                }
                else//Se trata de una modificacion
                {
                    //El legajo no se puede modificar por regla de negocio y ademas lo hace el motor de base de datos con un trigger
                    sql = @"Update Profesor set Nombre = @Nombre, Apellido = @Apellido, IdTipoDocumento = @IdTipoDocumento, 
                            NumeroDocumento = @NumeroDocumento, Telefono = @Telefono, Titulo = @Titulo Where IdProfesor = @IdProfesor";
                    cmd.Parameters.AddWithValue("@IdProfesor", profe.IdProfesor);
                }

                cmd.Connection = cn;
                cmd.CommandText = sql;
                cmd.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("IX_Profesor"))
                    throw new Exception("Ya existe un profesor con ese nro y tipo de documento...");
                throw new Exception("No se pudo guardar o modificar el Profesor...");
            }
            finally//Si la conexion se pudo abrir hay que cerrarla
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
            }
        }
        public static void eliminarProfesor(int idProfesor)
        {
            SqlConnection con = null;
            try
            {
                con = AccesoDato.dameConexion();
                con.Open();
                SqlCommand cmd = new SqlCommand();
                string sql = string.Empty;
                cmd.Parameters.AddWithValue("@IdProfesor", idProfesor);
                sql = @"delete from Profesor where IdProfesor = @IdProfesor";

                cmd.Connection = con;
                cmd.CommandText = sql;
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new Exception("No se puede eliminar un Profesor asignado a un curso...");
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                    con.Close();
            }
        }
    }//Fin de la clase
}//Fin del namespace
